{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Lesson_4-REVISED.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.5"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Spnt0b4tWtQd"
      },
      "source": [
        "# Урок 4"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "N7Ec4jnDWtQg"
      },
      "source": [
        "# Матрицы и матричные операции. Часть 2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XQhbHrm6WtQj"
      },
      "source": [
        "## Определитель матрицы"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "q4XCSZ8-WtQl"
      },
      "source": [
        "Рассмотрим произвольную квадратную матрицу порядка $n$:\n",
        "\n",
        "$$A=\\begin{pmatrix}\n",
        "a_{11} & a_{12} & \\cdots & a_{1n}\\\\ \n",
        "a_{21} & a_{22} & \\cdots & a_{2n}\\\\  \n",
        "\\cdots & \\cdots & \\ddots & \\cdots \\\\ \n",
        "a_{n1} & a_{n2} & \\cdots & a_{nn}\\\\ \n",
        "\\end{pmatrix}.$$\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ir5_R58-WtQm"
      },
      "source": [
        "С каждой такой матрицей свяжем численную характеристику, называемую _определителем_, соответствующим этой матрице. \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hdO0NqJ2WtQt"
      },
      "source": [
        "Сразу заметим, что понятие определителя имеет смысл __только для квадратных матриц__."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a-HcZiKoWtQv"
      },
      "source": [
        "Если порядок $n$ матрицы равен единице, то есть эта матрица состоит из одного элемента $a_{11}$, определителем, соответствующим такой матрице, назовем сам этот элемент.\n",
        "\n",
        "Если порядок матрицы равен $2$, то есть матрица имеет вид\n",
        "\n",
        "$$A=\\begin{pmatrix}\n",
        "a_{11} & a_{12}\\\\ \n",
        "a_{21} & a_{22}\n",
        "\\end{pmatrix},$$\n",
        "\n",
        "то определителем второго порядка, соответствующим такой матрице, назовем число, равное \n",
        "\n",
        "$$a_{11}a_{22} - a_{12}a_{21}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LCdmZS4QWtQw"
      },
      "source": [
        "Словесно это правило можно сформулировать так: _определитель второго порядка, соответствующий матрице $A$, равен разности произведения элементов, стоящих на главной диагонали этой матрицы, и элементов, стоящих на ее побочной диагонали._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "w3IcUxglWtQy"
      },
      "source": [
        "Определитель матрицы $A$ обозначается как $detA$, или $|A|$, то есть определитель второго порядка можно записать как\n",
        "\n",
        "$$detA=|A|=\\begin{vmatrix}\n",
        "a_{11} & a_{12}\\\\ \n",
        "a_{21} & a_{22}\n",
        "\\end{vmatrix}=a_{11}a_{22} - a_{12}a_{21}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_tdaIrSEWtQ0"
      },
      "source": [
        "Будем двигаться дальше и выясним понятие определителя для матриц порядка $n\\geq2.$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pJz1Pm0CWtQ1"
      },
      "source": [
        "Для этого введем понятие минора. _Минором_ любого элемента $a_{ij}$ матрицы $n$-го порядка назовем определитель порядка $n-1$, соответствующий матрице, которая получается из исходной матрицы путем вычеркивания $i$-й строки и $j$-го столбца (строки и столбца, на пересечении которых стоит элемент $a_{ij}$). Обозначать минор будем символом $M_{ij}$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uxmr-J0RWtQ3"
      },
      "source": [
        "Определителем матрицы порядка $n$ назовем число, равное\n",
        "\n",
        "$$detA=\\begin{vmatrix}\n",
        "a_{11} & a_{12} & \\cdots & a_{1n}\\\\ \n",
        "a_{21} & a_{22} & \\cdots & a_{2n}\\\\  \n",
        "\\cdots & \\cdots & \\ddots & \\cdots \\\\ \n",
        "a_{n1} & a_{n2} & \\cdots & a_{nn}\\\\ \n",
        "\\end{vmatrix} = \n",
        "\\sum_{j=1}^{n}(-1)^{j+1}a_{1j}M_{1j}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eKU3LhVOWtQ6"
      },
      "source": [
        "Эта формула представляет собой правило составления определителя порядка $n$ по элементам первой строки и минорам $M_{1j}$, являющимися определителями порядка $n-1$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mjsLcQTwWtQ-"
      },
      "source": [
        "Заметим, что при $n=2$ правило совпадает с введенным ранее правилом получения определителя для матриц второго порядка: в этом случае миноры элементов первой строки имеют вид $M_{11}=a_{22}$, $M_{12}=a_{21}$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kxrSyrxUWtRB"
      },
      "source": [
        "__Теорема__\n",
        "\n",
        "При любом произвольном номере строки $i~(i=1,2,...,n)$ для определителя порядка $n$ справедлива формула\n",
        "\n",
        "$$detA = \\sum_{j=1}^{n}(-1)^{i+j}a_{ij}M_{ij},$$\n",
        "\n",
        "называемая _разложением этого определителя по $i$-й строке._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4QRzf4SkWtRC"
      },
      "source": [
        "__Теорема__\n",
        "\n",
        "При любом произвольном номере столбца $j~(j=1,2,...,n)$ для определителя порядка $n$ справедлива формула\n",
        "\n",
        "$$detA = \\sum_{i=1}^{n}(-1)^{i+j}a_{ij}M_{ij},$$\n",
        "\n",
        "называемая _разложением этого определителя по $j$-му столбцу._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "moRv8QdcWtRE"
      },
      "source": [
        "Таким образом, определитель может быть сформирован разложением как по произвольной строке исходной матрицы, так и по произвольному ее столбцу."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AzNxsgSCWtRG"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Вычислим определитель\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "1 & 2 & 1\\\\ \n",
        "1 & 1 & 4\\\\ \n",
        "2 & 3 & 6\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "__Решение__\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "1 & 2 & 1\\\\ \n",
        "1 & 1 & 4\\\\ \n",
        "2 & 3 & 6\n",
        "\\end{vmatrix}=\n",
        "1\\cdot\\begin{vmatrix}\n",
        "1 & 4\\\\ \n",
        "3 & 6\n",
        "\\end{vmatrix}-\n",
        "2\\cdot\\begin{vmatrix}\n",
        "1 & 4\\\\ \n",
        "2 & 6\n",
        "\\end{vmatrix}+\n",
        "1\\cdot\\begin{vmatrix}\n",
        "1 & 1\\\\ \n",
        "2 & 3\n",
        "\\end{vmatrix}=1\\cdot(1\\cdot6-3\\cdot4)-2\\cdot(1\\cdot6-2\\cdot4)+1\\cdot(1\\cdot3-2\\cdot1)= \\\\\n",
        "=-6+4+1=-1.\n",
        "$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wPaCM7cyWtRH"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Найдем определитель матрицы \n",
        "\n",
        "$$A=\\begin{pmatrix}\n",
        "-1 & -4 & 0 & -2 \\\\ \n",
        "0 & 1 & 5 & 4 \\\\  \n",
        "3 & 1 & 1 & 0 \\\\ \n",
        "-1 & 0 & 2 & 2\\\\ \n",
        "\\end{pmatrix},$$\n",
        "\n",
        "разложив его<br>\n",
        "1) по элементам 2-го столбца;<br>\n",
        "2) по элементам 3-й строки."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3DQFHcJ7WtRJ"
      },
      "source": [
        "__Решение__\n",
        "\n",
        "1. Разложение определителяя 4-го порядка по элементам 2-го столбца будет иметь вид\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & a_{14}\\\\ \n",
        "a_{21} & a_{22} & a_{23} & a_{24}\\\\  \n",
        "a_{31} & a_{32} & a_{33} & a_{34} \\\\ \n",
        "a_{41} & a_{42} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} = \n",
        "(-1)^{1+2}a_{12}\\begin{vmatrix}\n",
        "a_{21} & a_{23} & a_{24}\\\\  \n",
        "a_{31} & a_{33} & a_{34} \\\\ \n",
        "a_{41} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} + (-1)^{2+2}a_{22}\\begin{vmatrix}\n",
        "a_{11} & a_{13} & a_{14}\\\\  \n",
        "a_{31} & a_{33} & a_{34} \\\\ \n",
        "a_{41} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} + (-1)^{3+2}a_{32}\\begin{vmatrix}\n",
        "a_{11} & a_{13} & a_{14}\\\\ \n",
        "a_{21} & a_{23} & a_{24}\\\\  \n",
        "a_{41} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} + (-1)^{4+2}a_{42}\\begin{vmatrix}\n",
        "a_{11} & a_{13} & a_{14}\\\\ \n",
        "a_{21} & a_{23} & a_{24}\\\\  \n",
        "a_{31} & a_{33} & a_{34} \\\\ \n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "Таким образом, для матрицы $A$\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-1 & -4 & 0 & -2 \\\\ \n",
        "0 & 1 & 5 & 4 \\\\  \n",
        "3 & 1 & 1 & 0 \\\\ \n",
        "-1 & 0 & 2 & 2\\\\ \n",
        "\\end{vmatrix} = 4\\begin{vmatrix}\n",
        "0 & 5 & 4 \\\\ \n",
        "3 & 1 & 0\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} + \\begin{vmatrix}\n",
        "-1 & 0 & -2\\\\ \n",
        "3 & 1 & 0\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} - \\begin{vmatrix}\n",
        "-1 & 0 & -2\\\\ \n",
        "0 & 5 & 4\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} + 0.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VSzmmBW3WtRK"
      },
      "source": [
        "Так задача нахождения определителя 4-го порядка сводится к нахождению трех определителей 3-го порядка. Вычислим первый, разложив по первой строке:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "0 & 5 & 4 \\\\ \n",
        "3 & 1 & 0\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} = \n",
        "0\\begin{vmatrix}\n",
        "1 & 0\\\\  \n",
        "2 & 2 \\\\ \n",
        "\\end{vmatrix}\n",
        "-5\\begin{vmatrix}\n",
        "3 & 0\\\\  \n",
        "-1 & 2 \\\\ \n",
        "\\end{vmatrix} + \n",
        "4\\begin{vmatrix}\n",
        "3 & 1\\\\  \n",
        "-1 & 2\\\\ \n",
        "\\end{vmatrix} = 0\\cdot(1\\cdot2-2\\cdot0)\n",
        "-5\\cdot(3\\cdot2 - (-1)\\cdot 0) + 4\\cdot(3\\cdot2 - (-1)\\cdot1) = -2.$$\n",
        "\n",
        "Аналогично вычисляем \n",
        "$$\\begin{vmatrix}\n",
        "-1 & 0 & -2\\\\ \n",
        "3 & 1 & 0\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} = \n",
        "(-1)\\begin{vmatrix}\n",
        "1 & 0\\\\  \n",
        "2 & 2 \\\\ \n",
        "\\end{vmatrix} - \n",
        "0\\begin{vmatrix}\n",
        "3 & 0\\\\  \n",
        "-1 & 2 \\\\ \n",
        "\\end{vmatrix} + \n",
        "(-2)\\begin{vmatrix}\n",
        "3 & 1\\\\  \n",
        "-1 & 2 \\\\ \n",
        "\\end{vmatrix} = \n",
        "(-1)\\cdot(1\\cdot2-2\\cdot0) - 0\\cdot(3\\cdot2-(-1)\\cdot0) + (-2)\\cdot(3\\cdot2-(-1)\\cdot1) = -16,$$\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-1 & 0 & -2\\\\ \n",
        "0 & 5 & 4\\\\  \n",
        "-1 & 2 & 2 \\\\ \n",
        "\\end{vmatrix} = \n",
        "(-1)\\begin{vmatrix}\n",
        "5 & 4\\\\  \n",
        "2 & 2 \\\\ \n",
        "\\end{vmatrix} - \n",
        "0\\begin{vmatrix}\n",
        "0 & 4\\\\  \n",
        "-1 & 2 \\\\ \n",
        "\\end{vmatrix} +\n",
        "(-2)\\begin{vmatrix}\n",
        "0 & 5\\\\  \n",
        "-1 & 2\\\\ \n",
        "\\end{vmatrix} = \n",
        "(-1)\\cdot(5\\cdot2 - 2\\cdot4) - 0\\cdot(0\\cdot2-(-1)\\cdot4) + (-2)\\cdot(0\\cdot2-(-1)\\cdot5) = -12.$$\n",
        "\n",
        "Подставляя полученные значения определителей в исходное разложение, получим\n",
        "\n",
        "$$|A| = 4\\cdot(-2) + (-16) - (-12) = -12.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kbwHyYIFWtRM"
      },
      "source": [
        "2. Разложение определителяя 4-го порядка по элементам 3-й строки будет иметь вид\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & a_{14}\\\\ \n",
        "a_{21} & a_{22} & a_{23} & a_{24}\\\\  \n",
        "a_{31} & a_{32} & a_{33} & a_{34} \\\\ \n",
        "a_{41} & a_{42} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} =\n",
        "(-1)^{3+1}a_{31}\\begin{vmatrix}\n",
        "a_{12} & a_{13} & a_{14}\\\\ \n",
        "a_{22} & a_{23} & a_{24}\\\\  \n",
        "a_{42} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} + \n",
        "(-1)^{3+2}a_{32}\\begin{vmatrix}\n",
        "a_{11} & a_{13} & a_{14}\\\\ \n",
        "a_{21} & a_{23} & a_{24}\\\\  \n",
        "a_{41} & a_{43} & a_{44}\\\\ \n",
        "\\end{vmatrix} + \n",
        "(-1)^{3+3}a_{33}\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{14}\\\\ \n",
        "a_{21} & a_{22} & a_{24}\\\\  \n",
        "a_{41} & a_{42} & a_{44}\\\\ \n",
        "\\end{vmatrix} +\n",
        "(-1)^{3+4}a_{34}\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13}\\\\ \n",
        "a_{21} & a_{22} & a_{23}\\\\  \n",
        "a_{41} & a_{42} & a_{43}\n",
        "\\end{vmatrix}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iszvTi4RWtRO"
      },
      "source": [
        "Для матрицы $A$:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-1 & -4 & 0 & -2 \\\\ \n",
        "0 & 1 & 5 & 4 \\\\  \n",
        "3 & 1 & 1 & 0 \\\\ \n",
        "-1 & 0 & 2 & 2\\\\ \n",
        "\\end{vmatrix} = 3\\begin{vmatrix}\n",
        "-4 & 0 & -2 \\\\ \n",
        "1 & 5 & 4 \\\\  \n",
        "0 & 2 & 2\\\\ \n",
        "\\end{vmatrix} -\\begin{vmatrix}\n",
        "-1 & 0 & -2 \\\\ \n",
        "0 & 5 & 4 \\\\  \n",
        "-1 & 2 & 2\\\\ \n",
        "\\end{vmatrix} + \\begin{vmatrix}\n",
        "-1 & -4 & -2 \\\\ \n",
        "0 & 1 & 4 \\\\  \n",
        "-1 & 0 & 2\\\\ \n",
        "\\end{vmatrix} - 0.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ys5PdIPzWtRQ"
      },
      "source": [
        "Найдем определители третьего порядка:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-4 & 0 & -2 \\\\ \n",
        "1 & 5 & 4 \\\\  \n",
        "0 & 2 & 2\\\\ \n",
        "\\end{vmatrix} = (-4)\\cdot(5\\cdot2-2\\cdot4) - 0\\cdot(1\\cdot2 - 0\\cdot4) + (-2)\\cdot(1\\cdot2-0\\cdot5)= -12,$$\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-1 & 0 & -2 \\\\ \n",
        "0 & 5 & 4 \\\\  \n",
        "-1 & 2 & 2\\\\ \n",
        "\\end{vmatrix} = (-1)\\cdot(5\\cdot2-2\\cdot4) - 0\\cdot(0\\cdot2-(-1)\\cdot4) + (-2)\\cdot(0\\cdot2-(-1)\\cdot5)= -12,$$\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "-1 & -4 & -2 \\\\ \n",
        "0 & 1 & 4 \\\\  \n",
        "-1 & 0 & 2\\\\ \n",
        "\\end{vmatrix} = (-1)\\cdot(1\\cdot2-0\\cdot4) - (-4)\\cdot(0\\cdot2-(-1)\\cdot4) + (-2)\\cdot(0\\cdot0-(-1)\\cdot1) = 12.$$\n",
        "\n",
        "Подставляя полученные значения определителей в исходное разложение, получим\n",
        "\n",
        "$$|A| = 3\\cdot(-12) - (-12) + 12 = -12.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-UaJ2NCBWtRR"
      },
      "source": [
        "### Выражение определителя непосредственно через его элементы"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eHmUtditWtRT"
      },
      "source": [
        "Установим формулу нахождения детерминанта $n$-го порядка непосредственно через его элементы (минуя миноры)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xlLXgmT4WtRW"
      },
      "source": [
        "Для этого введем понятия перестановок и транспозиций на множестве."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9F3btF-_WtRY"
      },
      "source": [
        "_Перестановкой_ на множестве $S=\\{1,2,3,...,n\\}$ называется множество тех же чисел, упорядоченное некоторым образом:\n",
        "\n",
        "$$\\{1,2,3,4\\}\\Rightarrow\\{3,4,1,2\\}.$$\n",
        "\n",
        "_Транспозицией_ называется такая перестановка, в которой переставлены местами только два элемента множества, в то время как остальные элементы остаются на своих местах:\n",
        "\n",
        "$$\\{1,2,3,4\\}\\Rightarrow\\{\\underline{4},2,3,\\underline{1}\\}.$$\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iy7smAqFWtRZ"
      },
      "source": [
        "Любую перестановку можно реализовать путем нескольких последовательных транспозиций. Например, перестановка $\\{3,4,1,2\\}$ представляет собой последовательность трех транспозиций:\n",
        "\n",
        "$$\\{\\underline{1},2,\\underline{3},4\\}\\Rightarrow\\{3,\\underline{2},1,\\underline{4}\\}\\Rightarrow\\{3,4,1,2\\}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OwBPNdCgWtRl"
      },
      "source": [
        "Принято,что перестановка содержит __инверсию__ элементов $i_{j}$ и $i_{k}$, если $i_{j}>i_{k}$ при $j<k.$\n",
        "\n",
        "Например, наша перестановка $\\{3,4,1,2\\}$ содержит четыре инверсии: \n",
        "\n",
        "- $3$ и $1$, так как число $3$ стоит слева от меньшего числа $1$, и по аналогии следующие: \n",
        "- $3$ и $2$; \n",
        "- $4$ и $1$;\n",
        "- $4$ и $2$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qGZbfhlEWtRp"
      },
      "source": [
        "Число инверсий определяет __четность__ перестановки. То есть перестановка считается четной, если она содержит четное число инверсий и нечетной, если нечетное число."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9HasR-bHWtRq"
      },
      "source": [
        "_Для множества $S=\\{1,2,3,...,n\\}$ существует $n!$ различных перестановок._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7LULOz89WtRr"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Возьмем множество $\\{1,2,3\\}$. Оно будет содержать $3!=6$ перестановок:\n",
        "\n",
        "$$\\{1,2,3\\}, \\{2,1,3\\}, \\{2,3,1\\}, \\{3,2,1\\}, \\{3,1,2\\}, \\{1,3,2\\}.$$\n",
        "\n",
        "При этом:\n",
        "\n",
        "- перестановки $\\{1,2,3\\}$, $\\{2,3,1\\}$ и $\\{3,1,2\\}$ будут являться четными;\n",
        "- перестановки $\\{2,1,3\\}$, $\\{3,2,1\\}$ и $\\{1,3,2\\}$ будут являться нечетными."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "okNO4nBVWtRt"
      },
      "source": [
        "__Вернемся к понятию определителя__"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1t9C0B0oWtRx"
      },
      "source": [
        "Возьмем квадратную матрицу $A$ $n$-го порядка (размера $n\\times n$) и множество $\\{k_{1}, k_{2}, ...,k_{n}\\}$, являющееся некоторой перестановкой упорядоченного множества натуральных чисел $\\{1,2,...,n\\}$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FSPk3eA5WtRz"
      },
      "source": [
        "Рассмотрим произведение, содержащее $n$ матричных элементов, взятых по одному из каждой строки, составленное следующим образом:\n",
        "\n",
        "$$a_{1k_{1}}a_{2k_{2}}...a_{nk_{n}}.$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-MPD3LJnWtR1"
      },
      "source": [
        "Первый множитель явлется элементом из первой строки и $k_{1}$ столбца, второй — из второй строки и $k_{2}$ столбца и т. д. \n",
        "\n",
        "Вспомним, что существует $n!$ различных перестановок $\\{k_{1}, k_{2}, ...,k_{n}\\}$ из индексов столбцов. Каждая из них будет формировать произведение указанного вида. Припишем каждому такому произведению знак $«+»$, если перестановка $\\{k_{1}, k_{2}, ...,k_{n}\\}$ четная, и $«-»$, если нечетная."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "I1s1k_0xWtR2"
      },
      "source": [
        "Чтобы описать это математически, введем выражение $P\\{k_{1}, k_{2}, ...,k_{n}\\}$, которое будет обозначать число инверсий в соответствующей перестановке. В этом случае удобно определять знак произведения таким образом:\n",
        "\n",
        "$$(-1)^{P\\{k_{1}, k_{2}, ...,k_{n}\\}}=\\begin{cases}\n",
        "+1 & \\text{ в случае четной перестановки, } \\\\ \n",
        "-1 & \\text{ в случае нечетной перестановки. } \n",
        "\\end{cases}$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "o3aadqLfWtR3"
      },
      "source": [
        "Сумма всех возможных произведений элементов матрицы $A$, описанных вышеуказанным образом, и будет являться определителем матрицы $A$:\n",
        "\n",
        "$$detA=\\sum_{\\{k_{1}, k_{2}, ...,k_{n}\\}}a_{1k_{1}}a_{2k_{2}}...a_{nk_{n}}(-1)^{P\\{k_{1}, k_{2}, ...,k_{n}\\}}.$$\n",
        "\n",
        "Данное правило также можно вывести из формулы определения через миноры. С выводом можно ознакомиться в книге В. А. Ильина и Э. Г. Позняка «Линейная алгебра» из списка литературы."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jvljVNvhWtR5"
      },
      "source": [
        "В случае $n=2$ формула элементарно проверяется, если принять во внимание, что существует всего две перестановки множества $\\{1,2\\}$: $\\{1,2\\}$ и $\\{2,1\\}$, первая из которых является четной, вторая — нечетной. Таким образом, получим\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "a_{11} & a_{12}\\\\ \n",
        "a_{21} & a_{22}\n",
        "\\end{vmatrix}=a_{11}a_{22} - a_{12}a_{21}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_C7EzUbfWtR6"
      },
      "source": [
        "В NumPy определитель матрицы вычисляется с помощью функции `numpy.linalg.det(a)`, где `a` — матрица."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1Hd6G6aZWtR7"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Найдем определители из примеров выше с помощью Python:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OSvS5DGTWtR8"
      },
      "source": [
        "import numpy as np"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BVROyCzhWtSE",
        "outputId": "70fa5775-278f-4a6b-ef89-44e645644c38"
      },
      "source": [
        "a = np.array([[1, 2, 1], [1, 1, 4], [2, 3, 6]])\n",
        "print(f'Матрица:\\n{a}')\n",
        "print(f'Определитель:\\n{np.linalg.det(a):.0f}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Матрица:\n",
            "[[1 2 1]\n",
            " [1 1 4]\n",
            " [2 3 6]]\n",
            "Определитель:\n",
            "-1\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Fsm_mFZ_WtSZ",
        "outputId": "12468bfd-7851-4e21-8f32-f150e0dc63ed"
      },
      "source": [
        "b = np.array([[-1, -4, 0, -2], [0, 1, 5, 4], [3, 1, 1, 0], [-1, 0, 2, 2]])\n",
        "print(f'Матрица:\\n{b}')\n",
        "print(f'Определитель:\\n{np.linalg.det(b):.0f}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Матрица:\n",
            "[[-1 -4  0 -2]\n",
            " [ 0  1  5  4]\n",
            " [ 3  1  1  0]\n",
            " [-1  0  2  2]]\n",
            "Определитель:\n",
            "-12\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VsaeLVelWtSs"
      },
      "source": [
        "### Свойства определителей"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7SI4xfPQWtSt"
      },
      "source": [
        "__1.__ Определитель транспонированной матрицы равен определителю исходной:\n",
        "\n",
        "$$detA^{T}=detA.$$\n",
        "\n",
        "__2.__ Умножение строки или столбца матрицы на число $\\lambda$ приведет к умножению определителя матрицы на то же число. \n",
        "\n",
        "- Доказательство этого свойства элементарно, так как, исходя из формулы определителя, множитель из этой строки будет в каждом из слагаемых при нахождении определителя разложением по этой строке/столбцу, что равнозначно его умножению на это число.\n",
        "\n",
        "__3.__ Перестановка любых двух строк или столбцов матрицы приводит к изменению знака определителя.\n",
        "\n",
        "- Это происходит из-за того, что дополнительная транспозиция меняет четность перестановки.\n",
        "\n",
        "__4.__ Если матрица имеет нулевую строку или столбец, то определитель равен нулю. \n",
        "\n",
        "- По аналогии с пунктом 2: в каждом из слагаемых будет множитель — элемент из этой строки (столбца), а значит, все они обнулятся.\n",
        "\n",
        "__5.__ Если две строки (столбца) матрицы равны между собой, то определитель этой матрицы равен нулю. \n",
        "\n",
        "- Согласно свойству 3, перестановка двух строк (столбцов) приводит к смене знака определителя. С другой стороны, если строки равны, то определитель измениться не должен. Оба эти условия одновременно выполняются, только когда определитель равен нулю:\n",
        "\n",
        "$$detA=-detA \\Rightarrow detA=0.$$\n",
        "\n",
        "__6.__ Если две строки (столбца) матрицы линейно зависимы, то определитель этой матрицы равен нулю.\n",
        "\n",
        "- Согласно свойству 2, множитель строки (столбца) можно вынести за знак определителя. Вынеся таким образом множитель пропорциональности, мы получим матрицу, имеющую две одинаковых строки (столбца). Согласно свойству 5, определитель такой матрицы равен нулю.\n",
        "\n",
        "__7.__ Определитель матрицы треугольного вида равен произведению элементов, стоящих на ее главной диагонали:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & \\cdots & a_{1n}\\\\ \n",
        "0 & a_{22} & a_{23} & \\cdots & a_{2n}\\\\ \n",
        "0 & 0 & a_{33} & \\cdots & a_{3n}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\ddots & \\cdots\\\\ \n",
        "0 & 0 & 0 & \\cdots & a_{nn}\n",
        "\\end{vmatrix}=a_{11}\\cdot a_{22}\\cdot ... \\cdot a_{nn}.$$\n",
        "\n",
        "__8.__ Если матрица $A$ ортогональна, то определитель такой матрицы \n",
        "\n",
        "$$detA = \\pm1.$$\n",
        "\n",
        "__9.__ Для двух квадратных матриц одинакового размера\n",
        "\n",
        "$$det(AB)=detA\\cdot detB.$$\n",
        "\n",
        "__10.__ Если элементы строки (столбца) матрицы являются результатом суммы, то\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & \\cdots & a_{1n}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{k1}+b_{k1} & a_{k2}+b_{k2} & a_{k3}+b_{k3} & \\cdots & a_{kn}+b_{kn}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\ddots & \\cdots\\\\ \n",
        "a_{1n} & a_{2n} & a_{3n} & \\cdots & a_{nn}\n",
        "\\end{vmatrix}=\n",
        "\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & \\cdots & a_{1n}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{k1} & a_{k2} & a_{k3} & \\cdots & a_{kn}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\ddots & \\cdots\\\\ \n",
        "a_{1n} & a_{2n} & a_{3n} & \\cdots & a_{nn}\n",
        "\\end{vmatrix}+\n",
        "\\begin{vmatrix}\n",
        "a_{11} & a_{12} & a_{13} & \\cdots & a_{1n}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "b_{k1} & b_{k2} & b_{k3} & \\cdots & b_{kn}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\ddots & \\cdots\\\\ \n",
        "a_{1n} & a_{2n} & a_{3n} & \\cdots & a_{nn}\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "__11.__ Если к одной из строк матрицы прибавить другую, умноженную на число, ее определитель не изменится:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{i1} & a_{i2} & a_{i3} & \\cdots & a_{in}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{k1}& a_{k2}& a_{k3} & \\cdots & a_{kn}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "\\end{vmatrix}=\n",
        "\\begin{vmatrix}\n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{i1} & a_{i2} & a_{i3} & \\cdots & a_{in}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "a_{k1}+\\lambda a_{i1} & a_{k2}+\\lambda a_{i2}& a_{k3}+\\lambda  a_{i3} & \\cdots & a_{kn}+\\lambda  a_{in}\\\\ \n",
        "\\cdots & \\cdots & \\cdots & \\cdots & \\cdots\\\\ \n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "- Такой определитель можно будет представить в виде суммы двух, первый из которых будет равен исходному, а второй будет содержать линейно зависимые строки, в связи с чем обратится в ноль."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RG9FYnc-WtS1"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Вычислим определитель\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "2 & -4 & 1\\\\ \n",
        "-3 & 2 & 5\\\\ \n",
        "1 & 2 & 3\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "__Решение__\n",
        "\n",
        "Так как при прибавлении к строке другой строки, умноженной на число, определитель не меняется, мы можем осуществить некоторые преобразования для обнуления максимального количества элементов:\n",
        "\n",
        "- преобразуем первую строку, вычтя третью, умноженную на 2;\n",
        "- преобразуем вторую строку, прибавив к ней третью, умноженную на 3.\n",
        "\n",
        "Получим:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "2 & -4 & 1\\\\ \n",
        "-3 & 2 & 5\\\\ \n",
        "1 & 2 & 3\n",
        "\\end{vmatrix}=\n",
        "\\begin{vmatrix}\n",
        "0 & -8 & -5\\\\ \n",
        "0 & 8 & 14\\\\ \n",
        "1 & 2 & 3\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "Далее поменяем местами первую и третью строки (при этом знак определителя изменится, по свойству 3):\n",
        "\n",
        "$$-\\begin{vmatrix}\n",
        "1 & 2 & 3\\\\\n",
        "0 & 8 & 14\\\\ \n",
        "0 & -8 & -5\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "И прибавим к третьей строке вторую:\n",
        "\n",
        "$$-\\begin{vmatrix}\n",
        "1 & 2 & 3\\\\\n",
        "0 & 8 & 14\\\\ \n",
        "0 & 0 & 9\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "Мы получили матрицу треугольного вида, определитель которой равен произведению диагональных элементов:\n",
        "\n",
        "$$-\\begin{vmatrix}\n",
        "1 & 2 & 3\\\\\n",
        "0 & 8 & 14\\\\ \n",
        "0 & 0 & 9\n",
        "\\end{vmatrix}=-1\\cdot8\\cdot9=-72.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Esg0JBK-WtS5"
      },
      "source": [
        "Проверим с помощью Python:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7Fc9MzonWtTD",
        "outputId": "e79c1c34-d6ce-4ec0-ea3b-db084ac4b794"
      },
      "source": [
        "a = np.array([[2, -4, 1], [-3, 2, 5], [1, 2, 3]])\n",
        "print(f'Матрица:\\n{a}')\n",
        "print(f'Определитель:\\n{np.linalg.det(a):.0f}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Матрица:\n",
            "[[ 2 -4  1]\n",
            " [-3  2  5]\n",
            " [ 1  2  3]]\n",
            "Определитель:\n",
            "-72\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "elGcFE5UWtTx"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "Матрица называется _сингулярной_, или _вырожденной_, если ее определитель равен нулю."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XlZJ4WziWtTy"
      },
      "source": [
        "## Ранг матрицы"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BAo2RtPdWtT0"
      },
      "source": [
        "Введем понятие минора $k$-го порядка.\n",
        "\n",
        "_Минором $k$-го порядка_ матрицы $A$ размера $m\\times n$ будем называть определитель $k$-го порядка ($k$ не превосходит меньшее из $m$ и $n$) с элементами, лежащими на пересерчении любых $k$ строк и любых $k$ столбцов матрицы $A$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ClAr_KVUWtT2"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "Предположим, что хотя бы один из элементов матрицы $A$ отличен от нуля. Тогда найдется целое положительное число $r$, такое, что:<br>\n",
        "1) у матрицы $A$ имеется минор $r$-го порядка, отличный от нуля;<br>\n",
        "2) любой минор порядка $r+1$ и выше равен нулю.\n",
        "\n",
        "Число $r$, удовлетворяющее этим требованиям, назовем _рангом матрицы $A$_ и обозначим $rankA$, а минор $r$-го порядка — _базисным минором_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KCOi5_ynWtT3"
      },
      "source": [
        "Иными словами, ранг матрицы — это порядок ее максимального невырожденного (или базисного) минора."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9Uxh4woyWtT7"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "_Строчным рангом матрицы_ называется максимальное число линейно независимых строк этой матрицы.\n",
        "\n",
        "_Столбцовым рангом матрицы_ называется максимальное число линейно независимых столбцов этой матрицы."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vD8T_4fcWtT9"
      },
      "source": [
        "__Теорема__\n",
        "\n",
        "_Строчный ранг матрицы всегда совпадает с столбцовым и равен максимальному размеру ее невырожденного минора._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a1PpFHRkWtUB"
      },
      "source": [
        "При работе с рангом матрицы важно знать, какие преобразования матриц не приводят к изменению их ранга:\n",
        "\n",
        "- транспонирование;\n",
        "\n",
        "- перестановка местами двух строк (столбцов);\n",
        "\n",
        "- умножение всех элементов строки (столбца) на число, не равное нулю;\n",
        "\n",
        "- прибавление ко всем элементам строки (столбца) соответствующих элементов другой строки (столбца);\n",
        "\n",
        "- выбрасывание нулевой строки (столбца);\n",
        "\n",
        "- выбрасывание строки (столбца), являющейся линейной комбинацией других строк (столбцов)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jO3TDClgWtUC"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Найдем ранг матрицы \n",
        "\n",
        "$$\\begin{pmatrix}\n",
        "1 & 2 & 3 & 4 & 5\\\\ \n",
        "2 & 5 & 8 & 11 & 14\\\\ \n",
        "3 & 9 & 14 & 20 & 26\\\\ \n",
        "5 & 14 & 22 & 31 & 40\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "Четвертая строка является суммой второй и третьей строк, а значит, ее можно отбросить:\n",
        "\n",
        "$$\\begin{pmatrix}\n",
        "1 & 2 & 3 & 4 & 5\\\\ \n",
        "2 & 5 & 8 & 11 & 14\\\\ \n",
        "3 & 9 & 14 & 20 & 26\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "Из второй и третьей строк вычтем первую, умноженную на $2$ и $3$ соответственно:\n",
        "\n",
        "$$\\begin{pmatrix}\n",
        "1 & 2 & 3 & 4 & 5\\\\ \n",
        "0 & 1 & 2 & 3 & 4\\\\ \n",
        "0 & 2 & 5 & 8 & 11\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "И вычтем из третьей строки вторую, умноженную на $2$:\n",
        "\n",
        "$$\\begin{pmatrix}\n",
        "1 & 2 & 3 & 4 & 5\\\\ \n",
        "0 & 1 & 2 & 3 & 4\\\\ \n",
        "0 & 0 & 1 & 2 & 3\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "Таким образом, ранг матрицы равен $3$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "590irmZBWtUE"
      },
      "source": [
        "В контексте машинного обучения эта характеристика особенно важна, так как наличие линейно зависимых строк в обучающей выборке приводит к избыточности информации и усложнению модели. Такие строки из обучающих выборок можно удалять без ущерба для точности получаемой модели, осуществляя сжатие данных без потерь."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AN0hWakcWtUF"
      },
      "source": [
        "В NumPy ранг матрицы вычисляется с помощью функции `numpy.linalg.matrix_rank(a)`, где `a` — матрица."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XSWRerTfWtUG"
      },
      "source": [
        "Кроме прочего, с помощью ранга матрицы можно проверять векторы на линейную зависимость.\n",
        "\n",
        "Имея несколько векторов, мы можем составить из них матрицу, где эти векторы будут являться строками или столбцами. Векторы будут линейно независимы тогда и только тогда, когда ранг полученной матрицы совпадет с числом векторов. "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "a9pk97QOWtUI",
        "outputId": "00035305-5c74-4048-88f2-7e0ce1270a37"
      },
      "source": [
        "x = [1, 2, 3]\n",
        "y = [2, 2, 2]\n",
        "z = [3, 3, 3]\n",
        "\n",
        "a = np.array([x, y, z])\n",
        "r = np.linalg.matrix_rank(a)\n",
        "\n",
        "print(f'Ранг матрицы: {r}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ранг матрицы: 2\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KKtVH7tdWtUP"
      },
      "source": [
        "## Понятие обратной матрицы"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "M8D3L-hFWtUT"
      },
      "source": [
        "Матрица $B$ называется _правой обратной матрицей_ к $A$, если \n",
        "\n",
        "$$AB=E,$$\n",
        "\n",
        "где $E$ — единичная матрица.\n",
        "\n",
        "Матрица $C$ называется _левой обратной матрицей_ к $A$, если \n",
        "\n",
        "$$CA=E.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2Vbf6_Z2WtUU"
      },
      "source": [
        "__Утверждение__\n",
        "\n",
        "Если для матрицы $A$ существуют левая и правая обратные матрицы, то они совпадают между собой."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E5XK9NjEWtUV"
      },
      "source": [
        "__Теорема__\n",
        "\n",
        "Для того, чтобы для матрицы $A$ существовали левая и правая обратные матрицы, необходимо и достаточно, чтобы       определитель матрицы $A$ был отличен от нуля."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dr5QAqLRWtUW"
      },
      "source": [
        "Таким образом, в случае невырожденных матриц можно опускать термины «левая» и «правая», и говорить просто о матрице, _обратной по отношению к матрице_ $A$, и обозначать ее символом $A^{-1}$:\n",
        "\n",
        "$$A^{-1}A=AA^{-1}=E,$$\n",
        "\n",
        "где $E$ — единичная матрица."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X6AtGCZPWtUZ"
      },
      "source": [
        "Если для матрицы $A$ существует обратная матрица, то она единственна."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cKV88bKDWtUa"
      },
      "source": [
        "_Если матрица вырождена, то у нее нет обратной матрицы._\n",
        "\n",
        "- __Доказательство__\n",
        "\n",
        "Допустим, матрица $A$ вырождена, то есть $detA=0$, и для нее существует обратная матрица $A^{-1}$. Тогда из соотношения $A\\cdot A^{-1}=E$ получим, что $detA\\cdot detA^{-1}=detE=1$, откуда следует, что $detA\\neq0$, что противоречит условию. То есть, если у матрицы есть обратная, значит, матрица невырождена. Что и требовалось доказать."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Y7iU1OfuWtUd"
      },
      "source": [
        "__Нахождение обратной матрицы (метод присоединенной матрицы)__\n",
        "\n",
        "Для ввода алгоритма нахождения обратной матрицы к матрице $A$ введем понятие алгебраического дополнения.\n",
        "\n",
        "_Алгебраическим дополнением_ элемента $a_{ij}$ квадратной матрицы $A$ порядка $n$ называют минор $M_{ij}$, умноженный на $(-1)^{i+j}$, и обозначают $A_{ij}$:\n",
        "\n",
        "$$A_{ij}=(-1)^{i+j}M_{ij}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vnq5Ohu3WtUe"
      },
      "source": [
        "Алгоритм нахождения обратной матрицы следующий:\n",
        "\n",
        "1. Найти определитель матрицы $A$ и убедиться, что $detA\\neq0$;\n",
        "\n",
        "2. Составить алгебраические дополнения $A_{ij}$ для каждого элемента матрицы $A$ и записать матрицу $A^{*}=(A_{ij})$ из найденных алгебраических дополнений.\n",
        "\n",
        "3. Записать обратную матрицу, определенную по формуле \n",
        "\n",
        "$$A^{-1}=\\frac{1}{detA}\\cdot A^{*T}.$$\n",
        "\n",
        "Матрицу $A^{*T}$ часто называют _присоединенной (союзной)_ к матрице $A$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vqGz-sbDWtUg"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Найдем обратную матрицу для матрицы\n",
        "\n",
        "$$A = \\begin{pmatrix}\n",
        "1 & 2 & 1\\\\ \n",
        "1 & 1 & 4\\\\ \n",
        "2 & 3 & 6\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "__Решение__\n",
        "\n",
        "1. Найдем определитель:\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "1 & 2 & 1\\\\ \n",
        "1 & 1 & 4\\\\ \n",
        "2 & 3 & 6\n",
        "\\end{vmatrix} = -6 + 4 + 1 = -1. $$\n",
        "\n",
        "2. Найдем алгебраические дополнения для каждого элемента:\n",
        "\n",
        "$$A_{11}=(-1)^{2}\\begin{vmatrix}\n",
        "1 & 4\\\\ \n",
        "3 & 6\n",
        "\\end{vmatrix} = -6,~\n",
        "A_{12}=(-1)^{3}\\begin{vmatrix}\n",
        "1 & 4\\\\ \n",
        "2 & 6\n",
        "\\end{vmatrix} = 2,~\n",
        "A_{13}=(-1)^{4}\\begin{vmatrix}\n",
        "1 & 1\\\\ \n",
        "2 & 3\n",
        "\\end{vmatrix} = 1,$$\n",
        "$$A_{21}=(-1)^{3}\\begin{vmatrix}\n",
        "2 & 1\\\\ \n",
        "3 & 6\n",
        "\\end{vmatrix} = -9,~\n",
        "A_{22}=(-1)^{4}\\begin{vmatrix}\n",
        "1 & 1\\\\ \n",
        "2 & 6\n",
        "\\end{vmatrix} = 4,~\n",
        "A_{23}=(-1)^{5}\\begin{vmatrix}\n",
        "1 & 2\\\\ \n",
        "2 & 3\n",
        "\\end{vmatrix} = 1,$$\n",
        "$$A_{31}=(-1)^{4}\\begin{vmatrix}\n",
        "2 & 1\\\\ \n",
        "1 & 4\\\\ \n",
        "\\end{vmatrix} = 7,~\n",
        "A_{32}=(-1)^{5}\\begin{vmatrix}\n",
        "1 & 1\\\\ \n",
        "1 & 4\n",
        "\\end{vmatrix} = -3,~\n",
        "A_{33}=(-1)^{6}\\begin{vmatrix}\n",
        "1 & 2\\\\ \n",
        "1 & 1\\\\ \n",
        "\\end{vmatrix} = -1.$$\n",
        "\n",
        "Полученная матрица из алгебраических дополнений:\n",
        "\n",
        "$$A^{*} = \\begin{pmatrix}\n",
        "-6 & 2 & 1\\\\ \n",
        "-9 & 4 & 1\\\\ \n",
        "7 & -3 & -1\n",
        "\\end{pmatrix},~\n",
        "A^{*T} = \\begin{pmatrix}\n",
        "-6 & -9 & 7\\\\ \n",
        "2 & 4 & -3\\\\ \n",
        "1 & 1 & -1\n",
        "\\end{pmatrix}.$$\n",
        "\n",
        "3. Используя формулу из алгоритма, получим\n",
        "\n",
        "$$A^{-1} = \\frac{1}{(-1)}\\cdot \\begin{pmatrix}\n",
        "-6 & -9 & 7\\\\ \n",
        "2 & 4 & -3\\\\ \n",
        "1 & 1 & -1\n",
        "\\end{pmatrix} = \\begin{pmatrix}\n",
        "6 & 9 & -7\\\\ \n",
        "-2 & -4 & 3\\\\ \n",
        "-1 & -1 & 1\n",
        "\\end{pmatrix}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9ImH93XbWtUh"
      },
      "source": [
        "В NumPy обратные матрицы вычисляются с помощью функции `numpy.linalg.inv(a)`, где `a` — матрица."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3ECrX0-wWtUi",
        "outputId": "1ea4cce3-4b1c-4acc-bf78-417cf70258ba"
      },
      "source": [
        "a = np.array([[1, 2, 1], [1, 1, 4], [2, 3, 6]], dtype=float)\n",
        "b = np.linalg.inv(a)\n",
        "\n",
        "print(f'Матрица A:\\n{a}\\n')\n",
        "print(f'Матрица B, обратная к A:\\n{b}\\n')\n",
        "print(f'Матрица AB (должна быть единичной):\\n{a.dot(b)}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Матрица A:\n",
            "[[1. 2. 1.]\n",
            " [1. 1. 4.]\n",
            " [2. 3. 6.]]\n",
            "\n",
            "Матрица B, обратная к A:\n",
            "[[ 6.  9. -7.]\n",
            " [-2. -4.  3.]\n",
            " [-1. -1.  1.]]\n",
            "\n",
            "Матрица AB (должна быть единичной):\n",
            "[[1. 0. 0.]\n",
            " [0. 1. 0.]\n",
            " [0. 0. 1.]]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NRcOh0gsWtUo"
      },
      "source": [
        "## Практическое задание"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "H3qXQfJ-WtUp"
      },
      "source": [
        "Все задания рекомендуется выполнять вручную, затем проверяя полученные результаты с использованием Numpy.\n",
        "\n",
        "__1.__ Вычислить определитель:\n",
        "\n",
        "   a)\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "sinx & -cosx\\\\ \n",
        "cosx & sinx\n",
        "\\end{vmatrix};$$\n",
        "\n",
        "   б)\n",
        "    \n",
        "$$\\begin{vmatrix}\n",
        "4 & 2 & 3\\\\ \n",
        "0 & 5 & 1\\\\ \n",
        "0 & 0 & 9\n",
        "\\end{vmatrix};$$\n",
        "    \n",
        "   в)\n",
        "\n",
        "$$\\begin{vmatrix}\n",
        "1 & 2 & 3\\\\ \n",
        "4 & 5 & 6\\\\ \n",
        "7 & 8 & 9\n",
        "\\end{vmatrix}.$$\n",
        "\n",
        "\n",
        "__2.__ Определитель матрицы $A$ равен $4$. Найти:\n",
        "\n",
        "   а) $det(A^{2})$;\n",
        "    \n",
        "   б) $det(A^{T})$;\n",
        "    \n",
        "   в) $det(2A)$.\n",
        "   \n",
        "__3.__  Доказать, что матрица\n",
        "\n",
        "$$\\begin{pmatrix}\n",
        "-2 & 7 & -3\\\\ \n",
        "4 & -14 & 6\\\\ \n",
        "-3 & 7 & 13\n",
        "\\end{pmatrix}$$\n",
        "   \n",
        "вырожденная.\n",
        "\n",
        "__4.__ Найти ранг матрицы:\n",
        "\n",
        "   а) $\\begin{pmatrix}\n",
        "1 & 2 & 3\\\\ \n",
        "1 & 1 & 1\\\\ \n",
        "2 & 3 & 4\n",
        "\\end{pmatrix};$\n",
        "\n",
        "   б) $\\begin{pmatrix}\n",
        "0 & 0 & 2 & 1\\\\ \n",
        "0 & 0 & 2 & 2\\\\ \n",
        "0 & 0 & 4 & 3\\\\ \n",
        "2 & 3 & 5 & 6\n",
        "\\end{pmatrix}.$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_VwC4GjRWtUs"
      },
      "source": [
        "## Литература"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4XfF_-WrWtUt"
      },
      "source": [
        "1. Ильин В. А., Позняк Э. Г. Линейная алгебра: Учеб. для вузов. — 6-е изд. — М.: Физматлит, 2005.\n",
        "2. Форсайт Дж., Молер К. Численное решение систем линейных алгебраических уравнений. — М.: Мир, 1969.\n",
        "3. Кострикин А. И., Манин Ю. И. Линейная алгебра и геометрия. Учеб. пособие для вузов. — 2-е изд. — М.: Наука, Главная редакция физико-математической литературы, 1986."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rDylWbOQWtUu"
      },
      "source": [
        "## Дополнительные материалы:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lGIZZmw7WtUw"
      },
      "source": [
        "1. [Определитель матрицы в NumPy](https://docs.scipy.org/doc/numpy-1.14.2/reference/generated/numpy.linalg.det.html)\n",
        "\n",
        "2. [Ранг матрицы в NumPy](https://docs.scipy.org/doc/numpy-1.14.2/reference/generated/numpy.linalg.matrix_rank.html)\n",
        "\n",
        "3. [Обращение матриц в NumPy](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html)"
      ]
    }
  ]
}